package com.battery.system.service.battery;

import java.util.Date;
import java.util.List;
import java.util.Map;

import com.alibaba.fastjson.JSONObject;
import com.battery.common.core.domain.AjaxResult;
import com.battery.common.entity.BatteryEntity;
import com.battery.common.utils.excel.DeviceExcel;
import com.battery.system.domain.ActivityCount;
import com.battery.system.domain.BO.DevOnOff;
import com.battery.system.domain.BO.DeviceBO;
import com.battery.system.domain.BO.NotIssued;
import com.battery.system.domain.Device;
import com.battery.system.domain.Prorely;
import com.battery.system.domain.VO.*;
import com.battery.system.service.IBaseService;
import io.netty.channel.ChannelHandlerContext;

/**
 * 设备Service接口
 *
 * @author battery
 * @date 2021-01-22
 */
public interface IDeviceService extends IBaseService<Device> {
    /**
     * 查询设备
     *
     * @param id 设备ID
     * @return 设备
     */
    public Device selectDeviceById(String id);

    /**
     * 查询设备列表
     *
     * @param device 设备
     * @return 设备集合
     */
    public List<Device> selectDeviceList(Device device);

    /**
     * 新增设备
     *
     * @param device 设备
     * @return 结果
     */
    public int insertDevice(Device device);

    /**
     * 修改设备
     *
     * @param device 设备
     * @return 结果
     */
    public int updateDevice(Device device);

    /**
     * 批量删除设备
     *
     * @param ids 需要删除的数据ID
     * @return 结果
     */
    public int deleteDeviceByIds(String ids);

    /**
     * 删除设备信息
     *
     * @param id 设备ID
     * @return 结果
     */
    public int deleteDeviceById(String id);

    /**
     * 查询仓库中设备列表数据
     *
     * @param deviceBO
     * @return
     */
    List<DeviceVO> selectWarehouseList(DeviceBO deviceBO);

    /**
     * 导入设备到仓库
     *
     * @param list
     * @return
     */
    String importExcel(List<DeviceExcel> list);

    /**
     * 划分设备
     *
     * @param device
     * @return
     */
    int allotDevOne(Device device);

    /**
     * 批量划分设备
     *
     * @param device
     * @return
     */
    int allotDevAll(Device device);

    /**
     * 逻辑删除设备
     *
     * @param id
     * @return
     */
    int deleteLogicDeviceById(String id);


    /**
     * 设备列表
     *
     * @param deviceBO
     * @return
     */
    List<DeviceVO> selectDeviceVOList(DeviceBO deviceBO);

    /**
     * 获取设备库存信息
     *
     * @param id
     * @return
     */
    List<BatteryEntity> getBatteryStockDetail(String id);

    /**
     * 根据机柜SN获取对应的设备信息
     *
     * @param sn
     * @return
     */
    Device selectBySn(String sn);


    /**
     * WS设备进行同步设置操作
     *
     * @param obj 机柜发送内容
     * @return 回复机柜消息
     */
    String wsDevSyncSettingOperation(JSONObject obj);

    /**
     * WS设备归还确认
     *
     * @param obj
     * @return
     */
    String wsRentConfirm(JSONObject obj);


    Device selectDeviceBySn(String sn);

    /**
     * WS设备心跳处理
     *
     * @param obj
     * @return
     */
    String wsHeartbeat(JSONObject obj);

    /**
     * WS设备同步库存处理
     *
     * @param obj
     * @return
     */
    String wsSyncBattery(JSONObject obj);

    /**
     * WS设备归还消息处理
     *
     * @param obj
     * @return
     */
    String wsReturnBack(JSONObject obj);

    List<Device> selectDeviceListByAccountId(String id);

    DeviceVV deleteDeviceVVById(String devId);

    int deviceDeployments(JSONObject json, String where);

    List<DevOnOff> selectByOnOff(String where);

    List<NotIssued> selectByNotIssued(String id, Integer date);

    List<NotIssued> selectByBubao(String id, int num);


    /**
     * 根据门店ID 获取对应的设备 电池数量信息
     *
     * @param storeId
     * @return
     */
    BatteryNumber getWsDevInStockNumByStoreId(String storeId);

    /**
     * 设备返回仓库操作
     *
     * @param id
     * @return
     */
    int returnWarehouse(String id);

    /**
     * 批量设置活动
     *
     * @param device
     * @return
     */
    int devChoseEvents(Device device);


    List<ActivityCount> selectUsedByActivity(Map<String, String> map);

    void updateDeviceToParnter(String devs, String id);

    /**
     * WS设备登录操作
     *
     * @param obj
     * @param ctxId
     * @param channelHandlerContext
     * @return
     */
    String wsLogin(JSONObject obj, String ctxId, ChannelHandlerContext channelHandlerContext);

    /**
     * ws设备强弹
     *
     * @param obj
     * @return
     */
    String popupConfirm(JSONObject obj);

    /**
     * 校验该门店底下是否存在设备
     *
     * @param storeId
     * @return
     */
    boolean checkDevIsCzByStoreId(String storeId);

    /**
     * 设备变更商户
     *
     * @param storeId
     * @param merchantId
     * @return
     */
    int changeDevMerchant(String storeId, String merchantId);

    /**
     * 【设备-调回功能块】--- 下级代理列表，展示下级代理闲置设备数量
     *
     * @param partnerId
     * @param partnerName 筛选条件
     * @return
     */
    List<PartnerNoUseDevVO> selectLowerPartnerForNoUseDev(String partnerId, String partnerName);

    /**
     * 【设备-调回功能块】 ---下级代理的闲置设备，展示下级代理闲置设备
     *
     * @param lowerPartnerId
     * @param sn
     * @return
     */
    List<DevNoUseVO> selectNoUseDevsByLowerPartner(String lowerPartnerId, String sn);

    /**
     * 批量调回设备
     *
     * @param ids
     * @param accountId
     * @return
     */
    AjaxResult recallDevs(String[] ids, String accountId);

    /**
     * 调拨设备
     *
     * @param ids
     * @param lowerPartnerId
     * @return
     */
    AjaxResult allotDevs(String[] ids, String lowerPartnerId);

    /**
     * 查询设备，根据门店分组
     *
     * @param where
     * @return
     */
    List<DevVO> onLineDevList(String where, String orderBy);

    /**
     * 查询设备，根据门店分组
     *
     * @param where
     * @return
     */
    int onLineDevListCount(String where);

    /**
     * 查询设备明细
     *
     * @param where
     * @return
     */
    List<DevInfoVO> devListByStoreId(String where);

    /**
     * 设备营业额列表
     *
     * @param deviceBO
     * @return
     */
    List<DeviceVO> listDevIncome(DeviceBO deviceBO);

    /**
     * 根据设备ID 回收设备
     *
     * @param id
     * @return
     */
    int devRecoveryById(String id);

    /**
     * 查询平台所有机柜数量
     *
     * @return
     */
    Integer selectAllCount();

    /**
     * 总设备的统计分析
     *
     * @return
     */
    DevAnalysisVO selectDevAnalysis();

    /**
     * 特殊 展示在线设备的空槽
     *
     * @param where
     * @param onOrderBy
     * @return
     */
    List<DevVO> onLineSpecialDevList(String where, String onOrderBy);

    /**
     * 批量回收设备
     *
     * @param where
     * @return
     */
    int devBatchRecovery(String where);

    /**
     * @param storeId
     * @return
     */
    List<Device> getRecyclableDevList(String storeId);

    /**
     * 获取闲置设备（新接口，有分页）
     *
     * @param where
     * @return
     */
    List<Device> getAsideDevs(String where);

    /**
     * 设备回收
     *
     * @param id
     * @return
     */
    int recoveryDev(String id);

    /**
     * 批量返回残酷操作
     *
     * @param ids
     * @return
     */
    int returnWarehouses(String ids);

    /**
     * 根据条件查询闲置设备数量
     *
     * @param where
     * @return
     */
    int asideDevCount(String where);
}
